[求助]关于单片机A/D转换后的数据处理

来源:百度知道 编辑:UC知道 时间:2024/05/09 06:47:47
我用STC12C5410AD单片机的AD转换功能处理一个电位器的模拟电压信号,由于该单片机的A/D转换是10位精度的,最后的转换结果为10位,根据该单片机的设计,所得10位转换结果的高八位将存在ADC_DATA寄存器中(地址是:0xC6),低两位存在ADC_LOW寄存器(地址是:0xBE)中的低两位中。然后我现在在P2口接了一个锁存器,之后接了三个数码管,想实现转换结果的数字显示。我用C语言编程,现在的问题是A/D转换后的结果是10位,而我希望的是通过P2口的八位驱动数码管,应该怎么处理啊,就是如何将10位的转换结果转化成我所需要的8位??????请高手指教。其实我也知道如果能把这十位转化成十进制的数在把个位十位百位拆分出来就能实现显示了,那有又怎么样把这十位转化成十进制呢?而且这十位保存在两个地址不相连的寄存器中,第一个寄存器的全8位和第二个寄存器的低两位,实在是不知道怎么处理了

楼上的不对,你没考虑参考电压怎么可能写对

假设参考电压是5v(也就是说,当你读入的10位数据为0b1111 1111 11时候,电压是5V,这个值是根据你接的参考电压选的)
a=ADC_DATA;
b=ADC_LOW;
a=a*4+b;
这个时候,a里面保存的是ADC的读数,不是实际电压值
double x;
x = 5.0 * a / 1023.0;注意要写.0,否则,int除int是整除
这个时候,x中得到的数据就是实际电压。
当然,如果这个数是有实际意义的物理量,这里要把x用对应公式计算为该物理量,如果想输出的就是得到的a这个无意义比例值,直接x=a;
然后就是把这个转为8位数码管
如果转换为定点数据,很简单:
unsigned char outData[8];
outData[0] = (unsigned char)(x);//由于x最大为5,所以整数部分直接处理,否则要整除,
x = x - outData[0];//把整数部分减掉
x = x * 10;//把下一位移到整数部分
outData[1] = (unsigned char)(x);//这样读出0.1这一位
上面是原理,为了让你明白,实际程序如下:
unsigned char outData[8];
x = x / 1.0;//后面常数是你的最高位,如果是10位就是除10.0,同样可以为0.1
for(i = 0;i<8;i++)
{
outData[i] = (unsigned char)x;
x = x - outData[i];
x = x*10;
}
这个时候,数组outData中就是你要的各位数据了,输出你会吧,别忘了点小数点。

另:有个东西可能你犯糊涂了,AD采样那个10位是2进制10位,也就是0到1023,数码管8位是10进制8位。也就是0到999999
如果你想输出8位2进制的话(就是p2口直接连8个发光二极管),那